home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1996 #6 / Amiga Plus CD - 1996 - No. 06.iso / pd / programmierung / proasm / routines / conreadpkt.r < prev    next >
Text File  |  1993-04-04  |  5KB  |  306 lines

  1.  
  2. ;---;  conreadpkt.r  ;---------------------------------------------------------
  3. *
  4. *    ****    CONSOLE READING BY SENDING PACKETS    ****
  5. *
  6. *    Author        Stefan Walter
  7. *    Version        1.01
  8. *    Last Revision    04.04.93
  9. *    Identifier    crp_defined
  10. *       Prefix        crp_    (console read with packets)
  11. *                 ¯       ¯         ¯
  12. *    Functions    InitConRead, ResetConRead, SendConRead, ExaminePacket
  13. *
  14. *    NOTE:    These routines have been collected because AmigaDOS does not
  15. *        provide comfortable read functions which can wait on additional
  16. *        signals.
  17. *
  18. ;------------------------------------------------------------------------------
  19.  
  20. ;------------------
  21.     ifnd    crp_defined
  22. crp_defined    =1
  23.  
  24. ;------------------
  25. crp_oldbase    equ __base
  26.     base    crp_base
  27. crp_base:
  28.  
  29. ;------------------
  30.  
  31. ;------------------------------------------------------------------------------
  32. *
  33. * InitConRead    Initialize packet sending. Open port and get packet.
  34. *
  35. * INPUT        d0    CON handle.
  36. *
  37. * RESULT:    d0    Packet or 0.
  38. *        ccr    On d0.
  39. *
  40. ;------------------------------------------------------------------------------
  41.  
  42. ;------------------
  43. InitConRead:
  44.  
  45. ;------------------
  46. ; Start.
  47. ;
  48. \start:
  49.     movem.l    d1-a6,-(sp)
  50.     lea    crp_base(pc),a4
  51.     lsl.l    #2,d0
  52.     move.l    d0,crp_handle(a4)
  53.  
  54. ;------------------
  55. ; Get port.
  56. ;
  57. \openport:
  58.     lea    crp_port(pc),a0
  59.     bsr    MakePort
  60.     beq.s    \done
  61.  
  62. ;------------------
  63. ; Get packet.
  64. ;
  65. \getpacket:
  66.     bsr    AllocPacket
  67.     beq.s    \error
  68.     move.l    d0,crp_packet(a4)
  69.     clr.b    crp_sent(a4)        ;no packet on the way
  70.     clr.w    crp_offset(a4)
  71.     bra.s    \done
  72.  
  73. ;------------------
  74. ; Error => close port.
  75. ;
  76. \error:
  77.     lea    crp_port(pc),a0
  78.     bsr    UnMakePort
  79.     moveq    #0,d0
  80.  
  81. ;------------------
  82. ; Done.
  83. ;
  84. \done:
  85.     tst.l    d0
  86.     movem.l    (sp)+,d1-a6
  87.     rts
  88.  
  89. ;------------------
  90.  
  91. ;------------------------------------------------------------------------------
  92. *
  93. * SendConRead    Send the read packet if it's not on the way. A read with length
  94. *        1 is sent, ExaminePacket will read a line using this.
  95. *
  96. * RESULT:    d0    -1 if okay, 0 if packet already on the way.
  97. *        ccr    On d0.
  98. *
  99. ;------------------------------------------------------------------------------
  100.  
  101. ;------------------
  102. SendConRead:
  103.  
  104. ;------------------
  105. ; Start.
  106. ;
  107. \start:
  108.     movem.l    d1-a6,-(sp)
  109.     lea    crp_base(pc),a4
  110.     moveq    #0,d0
  111.     tst.b    crp_sent(a4)
  112.     bne.s    \done
  113.  
  114. ;------------------
  115. ; Fill in packet.
  116. ;
  117. \fill:
  118.     move.l    crp_packet(pc),a0
  119.     pea    crp_temp(pc)
  120.     moveq    #82,d3
  121.     move.l    d3,8(a0)        ;READ!
  122.     move.l    (sp)+,24(a0)        ;Buffer
  123.     moveq    #1,d3
  124.     move.l    d3,28(a0)        ;Length
  125.     move.l    crp_handle(pc),a1
  126.     move.l    36(a1),20(a0)        ;Arg1 from filehandle
  127.  
  128. ;------------------
  129. ; Send packet.
  130. ;
  131. \send:
  132.     move.l    a0,d1
  133.     move.l    8(a1),d2        ;port of CON:
  134.     pea    crp_port(pc)
  135.     move.l    (sp)+,d3
  136.     bsr    SendPacket
  137.     st.b    crp_sent(a4)
  138.     moveq    #-1,d0
  139.  
  140. ;------------------
  141. ; Done.
  142. ;
  143. \done:
  144.     tst.l    d0
  145.     movem.l    (sp)+,d1-a6
  146.     rts
  147.     
  148. ;------------------
  149.  
  150. ;------------------------------------------------------------------------------
  151. *
  152. * ResetConRead    Reset packet sending. Free dos object and remove port.
  153. *
  154. ;------------------------------------------------------------------------------
  155.  
  156. ;------------------
  157. ResetConRead:
  158.  
  159. ;------------------
  160. ; Start.
  161. ;
  162. \start:
  163.     movem.l    d0-a6,-(sp)
  164.            move.l    crp_packet(pc),d0    ;no packet installed?
  165.     beq.s    \exit
  166.  
  167.     move.b    crp_sent(pc),d0        ;is it on the way?
  168.     beq.s    \nowait
  169.     pea    crp_port(pc)
  170.     move.l    (sp)+,d0
  171.     bsr    WaitForPacket
  172.  
  173. \nowait:
  174.            move.l    crp_packet(pc),d0
  175.     bsr    FreePacket
  176.     lea    crp_port(pc),a0
  177.     bsr    UnMakePort
  178.  
  179. ;------------------
  180. ; exit
  181. ;
  182. \exit:
  183.     movem.l    (sp)+,d0-a6
  184.     rts
  185.  
  186. ;------------------
  187.  
  188. ;------------------------------------------------------------------------------
  189. *
  190. * ExaminePacket    Wait for our packet to return and get all text until the next
  191. *        CR to the buffer.
  192. *
  193. * RESULT:    a0    Text if d0>=0, zeroterminated.
  194. *        d0    Length (a0+d0=pointer on zero), -1 if EOF
  195. *        ccr    On d0.
  196. *
  197. ;------------------------------------------------------------------------------
  198.  
  199. ;------------------
  200. ExaminePacket:
  201.  
  202. ;------------------
  203. ; Start.
  204. ;
  205. \start:
  206.     movem.l    d1-d7/a1-a6,-(sp)
  207.  
  208. ;------------------
  209. ; Loop.
  210. ;
  211. \loop:
  212.     pea    crp_port(pc)
  213.     move.l    (sp)+,d0
  214.     bsr    WaitForPacket
  215.     lea    crp_sent(pc),a1
  216.     clr.b    (a1)
  217.  
  218. ;------------------
  219. ; Get that damn Packet.
  220. ;
  221. \packet:
  222.     move.l    d0,a1
  223.     move.l    24(a1),a0
  224.     move.l    12(a1),d0
  225.     beq.s    \close
  226.     move.b    (a0),d1
  227.     lea    crp_buffer(pc),a0
  228.     moveq    #0,d0
  229.     lea    crp_offset(pc),a2
  230.     move.w    (a2),d0    
  231.     cmp.b    #$a,d1
  232.     beq.s    \cr
  233.     cmp.w    #200,d0
  234.     beq.s    \no
  235.     move.b    d1,(a0,d0)
  236.     addq.w    #1,d0
  237. \no:
  238.     move.w    d0,(a2)
  239.     bsr    SendConRead
  240.     bra.s    \loop
  241.  
  242. ;------------------
  243. ; This one was CR.
  244. ;
  245. \cr:
  246.     clr.w    (a2)        ;clear offset for next line
  247.     clr.b    (a0,d0)
  248.     tst.w    d0
  249.     bra.s    \done
  250.  
  251. ;------------------
  252. ; Close gadget hit...
  253. ;
  254. \close:
  255.     moveq    #-1,d0
  256.  
  257. ;------------------
  258. ; Done.
  259. ;
  260. \done:
  261.     movem.l    (sp)+,d1-d7/a1-a6
  262.     rts
  263.  
  264. ;------------------
  265.  
  266. ;--------------------------------------------------------------------
  267.  
  268. ;------------------
  269.     include    doslib.r
  270.     include    ports.r
  271.     include    structs.r
  272.     include    packets.r
  273.  
  274. ;------------------
  275. ; The port.
  276. ;
  277. crp_port    PortStruct_
  278.  
  279. ;------------------
  280. ; Data.
  281. ;
  282. crp_packet:    dc.l    0
  283. crp_sent:    dc.b    0
  284. crp_temp:    dc.b    0
  285. crp_offset:    dc.w    0
  286. crp_handle:    dc.l    0
  287.  
  288.     ifd    cio_readbuffer
  289. crp_buffer    equ    cio_readbuffer
  290.     else
  291. crp_buffer:    ds.b    202,0
  292.     endif
  293.  
  294. ;------------------
  295.  
  296. ;--------------------------------------------------------------------
  297.  
  298. ;------------------
  299.     base    crp_oldbase
  300.  
  301. ;------------------
  302.     endif
  303.  
  304.  end
  305.  
  306.